package Q17_07_Baby_Names;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map.Entry;
import java.util.Set;
public class QuestionA {
/* Read through (name, frequency) pairs and initialize a mapping
* of names to NameSets (equivalence classes).*/
public static HashMap<String, NameSet> constructGroups(HashMap<String, Integer> names) {
HashMap<String, NameSet> groups = new HashMap<String, NameSet>();
for (Entry<String, Integer> entry : names.entrySet()) {
String name = entry.getKey();
int frequency = entry.getValue();
NameSet group = new NameSet(name, frequency);
groups.put(name, group);
}
return groups;
}
public static void mergeClasses(HashMap<String, NameSet> groups, String[][] synonyms) {
for (String[] entry : synonyms) {
String name1 = entry[0];
String name2 = entry[1];
NameSet set1 = groups.get(name1);
NameSet set2 = groups.get(name2);
if (set1 != set2) {
/* Always merge the smaller set into the bigger one. */
NameSet smaller = set2.size() < set1.size() ? set2 : set1;
NameSet bigger = set2.size() < set1.size() ? set1 : set2;
/* Merge lists */
Set<String> otherNames = smaller.getNames();
int frequency = smaller.getFrequency();
bigger.copyNamesWithFrequency(otherNames, frequency);
/* Update mapping */
for (String name : otherNames) {
groups.put(name, bigger);
}
}
}
}
public static HashMap<String, Integer> convertToMap(HashMap<String, NameSet> groups) {
HashMap<String, Integer> list = new HashMap<String, Integer>();
for (NameSet group : groups.values()) {
list.put(group.getRootName(), group.getFrequency());
}
return list;
}
public static HashMap<String, Integer> trulyMostPopular(HashMap<String, Integer> names, String[][] synonyms) {
HashMap<String, NameSet> groups = constructGroups(names);
mergeClasses(groups, synonyms);
return convertToMap(groups);
}
public static void main(String[] args) {
HashMap<String, Integer> names = new HashMap<String, Integer>();
names.put("John", 3);
names.put("Jonathan", 4);
names.put("Johnny", 5);
names.put("Chris", 1);
names.put("Kris", 3);
names.put("Brian", 2);
names.put("Bryan", 4);
names.put("Carleton", 4);
String[][] synonyms =
{{"John", "Jonathan"},
{"Jonathan", "Johnny"},
{"Chris", "Kris"},
{"Brian", "Bryan"}};
HashMap<String, Integer> finalList = trulyMostPopular(names, synonyms);
for (Entry<String, Integer> entry : finalList.entrySet()) {
String name = entry.getKey();
int frequency = entry.getValue();
System.out.println(name + ": " + frequency);
}
}
}